home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Hacks / Hacks ’95 / INIT ThemeSong / using SCSIStat / AsyncInit.Asm.SCSIStat
Encoding:
Text File  |  1995-06-24  |  5.5 KB  |  315 lines  |  [TEXT/QED1]

  1. ;            .VERBOSE
  2.  
  3. MACRO       MEA1        source,dest =
  4.     LEA    {source},A1
  5.     MOVE.L    A1,{dest}|
  6.  
  7. MACRO    TAS    abs.W =    ;left out of the assembler
  8.     DC.W    $4AF8,{abs.W}|
  9.  
  10.     IF    1 > 2    ;bug in MDS 2.0 & CDS 3.0
  11. X    SET    -1    ;listing indicator
  12.     MACRO    GT = < |
  13.     MACRO    GE = <=|
  14.     MACRO    LT = > |
  15.     MACRO    LE = >=|
  16.     ELSE
  17. X    SET    -1    ;listing indicator
  18.     MACRO    GT = > |
  19.     MACRO    GE = >=|
  20.     MACRO    LT = < |
  21.     MACRO    LE = <=|
  22.     ENDIF
  23.  
  24. MACRO    RECORD    start,direction =
  25. _loc    SET    {start}+0
  26. _dir    SET    -1
  27.     IF    '{direction|0:1}'<>'D'
  28.     IF    '{direction|0:1}'<>'d'
  29. _dir    SET    +1
  30.     ENDIF            ;ELSE IF not in MDS 2.0
  31.     ENDIF |
  32.  
  33. MACRO    VAR    size = EQU _loc-(_dir=-1)*({size})
  34.     FILL    {size} |
  35.  
  36. MACRO    FILL    size =
  37. _loc    SET    _loc+_dir*({size}) |
  38.  
  39. MACRO    ALGN    o,m =
  40. _loc    SET    (_loc-({o})+_dir*(_dir*({o}-_loc) LT 0)*({m}-1))/({m})*({m})+{o}|
  41.  
  42. MACRO    ENDR =    EQU _loc |
  43.  
  44. ;    INCLUDE    FSPrivate.txt    ;CDS version
  45. cacheCom    EQU     $39C
  46. noRWIPBit    EQU     7
  47.     INCLUDE    Traps.D
  48.     INCLUDE    SysEquX.D
  49.     INCLUDE    FSEqu.D
  50. .TRAP    _DebugStr    $ABFF
  51. .TRAP    _SCSIDispatch $A815
  52. scsiStat    EQU    10
  53.     .MACRO    _SCSIStat
  54.     MOVE    #scsiStat,-(sp)
  55.     _SCSIDispatch
  56.     .ENDM
  57. BSY    EQU    6
  58. SysHeap     EQU         $40
  59. Purgeable   EQU         $20
  60. Locked      EQU         $10
  61. Protected   EQU         $08
  62. Preload     EQU         $04
  63. Changed     EQU         $02
  64.  
  65. SCSIGlobals    EQU    $C0C
  66. scsiBusy    EQU    $61
  67. sndRefNum    EQU    -4
  68. buffsize    EQU    512*22
  69. N    EQU    4    ;number of buffers
  70. vblSize    EQU    vblPhase+2
  71. ffMode    EQU    0
  72. saveTemp    EQU    ioFileType    ;convenient location
  73.  
  74.     RECORD    0,INCREMENT
  75. orlen    VAR    4
  76. orptr    VAR    4
  77. rate    VAR    4
  78. datahndl    VAR    4
  79. codehndl    VAR    4
  80. taskcount    VAR    2
  81.     ALGN    0,4    ;for '020 efficiency
  82. hdrsize    ENDR
  83.  
  84.     RECORD    0,INCREMENT
  85.     FILL    ioQElSize
  86. vblQEl1    VAR    vblSize
  87. sndPB    VAR    ioQElSize
  88. vblQEl2    VAR    vblSize
  89.     FILL    4    ;for rate -- mode overlaps vblPhase
  90. readbuff    VAR    buffsize
  91. overrun    VAR    368
  92.     ALGN    0,4    ;for '020 efficiency
  93. blksize    ENDR
  94.  
  95. ratevalue    EQU    $00010000
  96.  
  97.     RESOURCE    'sysz' 0
  98.     DC.L    (codeend-codestart)+1024+hdrsize+N*blkSize
  99.  
  100.  
  101.     RESOURCE    'INIT' 128 'AsyncInit' SysHeap+Locked
  102. codestart
  103.     JMP    install
  104.     DC.W    'Copyright © 1990 Harvey Grosser'
  105.  
  106.  
  107. readcomp:
  108.     MOVEQ    #$FF-(1<<noRWIPBit),D1    ;mask to preserve other bits
  109.     OR.B    saveTemp(A0),D1    ;get saved value
  110.     AND.B    D1,CacheCom        ;clear it if it was cleared before
  111.  
  112. countR    EQU    D1
  113. ovR    EQU    D2
  114.  
  115.     MOVE.L    A3,-(A7)
  116.     MOVE.L    ioOwnBuf(A0),A3
  117.     MOVE.L    orlen(A3),ovR
  118.     MOVE.L    ioActCount(A0),countR
  119.     MOVE.L    orptr(A3),A1
  120.     CMP.L    ovR,countR
  121.     BGT.S    @gtov
  122.  
  123.     SUBQ.W    #1,taskcount(A3)
  124.     BNE.S    @more
  125.     LEA    @closed,A1
  126.     MOVE.L    A1,ioCompletion(A0)
  127.     _Close    ,ASYNC
  128.     BRA.S    @restore
  129.  
  130. @more
  131.     CLR.L    orlen(A3)
  132.     LEA    readbuff(A0),A0
  133.     MOVE.L    countR,D0
  134.     _BlockMove
  135.     ADDA.L    countR,A1
  136.     SUB.L    countR,ovR
  137.  
  138.     MOVE.L    #$80808080,D0
  139.     MOVEQ    #3,D1
  140.     AND.W    ovR,D1
  141.     BRA.S    @1
  142. @0    MOVE.B    D0,(A1)+
  143. @1    DBRA    D1,@0
  144.     LSR.W    #3,ovR
  145.     BCS.S    @3
  146.     BRA.S    @4
  147. @2    MOVE.L    D0,(A1)+
  148. @3    MOVE.L    D0,(A1)+
  149. @4    DBRA    ovR,@2
  150.  
  151.     BRA.S    @restore
  152. @gtov
  153.     ;amount read is greater than previous overrun
  154.     LEA    readbuff(A0),A0
  155.     MOVE.L    ovR,D0
  156.     _BlockMove
  157.     ;LEA    -6(A0,ovR),A1    ;gets assembled incorrectly...
  158.     LEA    -6(A0,D2),A1    ;... so repeat it
  159.     LEA    sndPB-readbuff(A0),A0
  160.     MOVE.L    A1,ioBuffer(A0)
  161.     CLR.W    (A1)+    ;ffMode
  162.     MOVE.L    rate(A3),(A1)+
  163.     SUB.L    ovR,countR    ;amount left in buffer
  164.     ADDA.L    countR,A1    ;point beyond data just read
  165.     MOVE.L    #370<<16,D2    ;largest possible dividend + 1
  166.     SUB.L    countR,D2
  167.     DIVU    #370,D2
  168.     CLR.W    D2
  169.     SWAP    D2
  170.     ADD.L    D2,countR
  171.  
  172.     MOVE.L    A1,orptr(A3)
  173.     MOVE.L    ovR,orlen(A3)
  174.  
  175.     MOVE.L    countR,ioReqCount(A0)
  176.     _Write    ,ASYNC
  177. @restore
  178.     MOVE.L    (A7)+,A3
  179.     RTS
  180.  
  181. @closed
  182.     MOVE.L    ioOwnBuf(A0),A1
  183.     MOVE.L    datahndl(A1),A0
  184.     _HUnlock
  185.     _HPurge
  186.     MOVE.L    codehndl(A1),A0
  187.     _HUnlock
  188.     _HPurge
  189.     RTS
  190.  
  191.  
  192. sndcomp:
  193.     BNE.S    @done        ;test for _KillIO
  194.     LEA    vblQEl1-sndPB(A0),A0
  195.     MOVE.W    #1,vblCount(A0)
  196.     _VInstall
  197. @done    MOVE.B    #$80,SoundLevel    ;eliminate end click on non-ASC machines
  198.     RTS
  199.  
  200.  
  201. vbltask1:
  202.     MOVE.L    A0,A3
  203.     TST.B    FSBusy
  204.     BNE.S    vbltaskplus
  205.     _Debugger
  206.     MOVE.L    SCSIGlobals,A1;
  207.     TST.B    scsiBusy(A1);
  208. ;    MOVE.L    #scsiStat<<16,-(A7)
  209. ;    _SCSIDispatch
  210. ;    MOVE.W    (A7)+,D0
  211.     ;BTST    #BSY,D0
  212. ;    TST.B    D0
  213.     BEQ.S    vbltaskplus
  214.     ADDQ.W    #1,vblCount(A3)
  215.     RTS
  216. vbltaskplus
  217.     LEA    vblQEl2-vblQEl1(A3),A0
  218.     MOVE.W    #1,vblCount(A0)
  219.     LEA    VBLQueue,A1
  220.     _Enqueue
  221.     RTS
  222.  
  223.  
  224. vbltask2:
  225.     _VRemove
  226.     BCLR    #inVBL,VBLQueue+qFlags
  227.     CLR.L    (A0)    ;qLink
  228.     ST    vblCount+1(A0)
  229.     LEA    -vblQEl2(A0),A0
  230. read
  231.     TAS    CacheCom    ;test and set bit to disable caching
  232.     SMI    saveTemp(A0)    ;save old value
  233.     _Read    ,ASYNC
  234.     RTS
  235. compend
  236.  
  237.  
  238. openerr:
  239.     MOVE.L    datahndl(A3),A0
  240.     MOVE.L    D0,D1
  241.     _DisposHandle
  242.     MOVE.L    D1,D0
  243. nomem:
  244.     NEG.W    D0
  245.     MOVE.W    D0,-(A7)
  246.     _SysBeep
  247.     RTS
  248.  
  249. install:
  250.     _HLock
  251.     MOVE.L    A0,D6
  252.     MOVE.L    #hdrsize+N*blkSize,D0
  253.     MOVE.L    D0,D1
  254.     _ResrvMem    ,SYS
  255.     MOVE.L    D1,D0
  256.     _NewHandle    ,SYS
  257.     BNE    nomem
  258.     _HLock
  259.     MOVEA.L    (A0),A3
  260.     MOVE.L    A3,A2
  261.     MOVEQ    #(hdrsize+readbuff)/4-1,D0
  262. @clr    CLR.L    (A2)+
  263.     DBRA    D0,@clr    ;A2 points to readbuff
  264.  
  265.     MOVE.W    #N,taskcount(A3)
  266.     MOVE.L    A0,datahndl(A3)
  267.     MOVE.L    D6,codehndl(A3)
  268.     MOVE.L    #ratevalue,rate(A3)
  269.  
  270.     LEA    hdrsize(A3),A0
  271.     MEA1    'StartupSound',ioFileName(A0)
  272.     MOVE.B    #fsRdPerm,ioPermssn(A0)
  273.     _HOpen        ;we'll eventually specify a DirID
  274.     BNE    openerr
  275.     MEA1    readcomp,ioCompletion(A0)
  276.     MOVE.L    A3,ioOwnBuf(A0)
  277.     MOVE.L    A2,ioBuffer(A0)    ;points to readbuff
  278.     MOVE.L    #buffsize,ioReqCount(A0)
  279. ;    ;CLR.W    ioPosMode(A0)    ;= fsAtMark
  280.     MOVE.W    #sndRefNum,sndPB+ioRefNum(A0)
  281.     MEA1    sndcomp,sndPB+ioCompletion(A0)
  282.     MOVE.W    #vType,vblQEl1+qType(A0)
  283.     MOVE.W    #vType,vblQEl2+qType(A0)
  284.     MEA1    vbltask2,vblQEl2+vblAddr(A0)
  285.  
  286.     LEA    vbltaskplus,A2
  287.     TST.W    ROM85
  288.     BMI.S    @plus
  289.     ;MOVE.L    ROMBase,A1
  290.     ;CMPI.W    #$0075,8(A1)
  291.     ;BEQ.S    @plus
  292.     LEA    vbltask1,A2
  293. @plus    MOVE.L    A2,vblQEl1+vblAddr(A0)
  294.  
  295.     BSR    read
  296.     MOVEQ    #N-2,D1
  297.     MOVE.L    #blksize,D5
  298. @top
  299.     MOVE.L    #readbuff,D0
  300.     LEA    0(A0,D5.L),A1
  301.     _BlockMove
  302.     ADD.L    D5,ioBuffer(A1)
  303.     MOVE.L    A1,A0
  304.     BSR    read
  305.     DBRA    D1,@top
  306.     MOVE.L    D6,-(A7)
  307.     _DetachResource
  308.     MOVE.L    D6,A0
  309.     MOVE.L    #compend-codestart,D0
  310.     _SetHandleSize
  311.     RTS
  312. codeend
  313.     END
  314.  
  315.